// const qs = require("querystring");
const cors = require("cors");
const expressJWT = require("express-jwt");
const errMiddleware = require("./error");
const { serverLogger, logger } = require("./logger");
const staticInit = require("../config/uitils/static");
// const customSession = require("./session");
const YRouter = require("../src/controller/AuthController");
const { secretKey, unless } = require("../config/token.config");

// 测试中间件
const textMw = (req, res, next) => {
  // 进行向下流转
  next();
}

/**
 * 中间件的统一处理，默认请使用静态方法‘init’
 * @param {*} app：生成后的服务对象
 */
class InitMiddleware{
  constructor(app) {
    this.app = app;
    // 初始化的时先处理请求数据
    this.joinDataChunk();
  }

  /**
   * 中间件统一处理的功能包括：
   *  1、基础中间件的挂载
   *  2、路由的处理
   *  3、异常兜底的处理
   * 注：若后期补充用户认证的功能则在路由之前进行处理
   * @param {app} app：生成后的服务对象，进行挂载中间件
   * @param {express} express：生成服务的对象，进行挂载对象本身提供的 json 等中间件
   */
  static init(app, express) {
    // 根据配置参数开启公共资源文件
    staticInit(app, express.static);
    // 当前进行测试 JSONP 的使用
    app.get("/api/jsonp", InitMiddleware.setJSONP);
    // 测试中间件
    app.use(textMw);
    // json 处理
    app.use(express.json());
    // 配置解析 application/x-www-form-urlencoded 格式数据
    // 当前也可使用 body-parser 进行body 数据的处理，express 底层引用的就是 body-parser
    app.use(express.urlencoded({ extended: false }));
    app.use(serverLogger);
    app.use(cors());
    // session 认证的挂载
    // app.use(customSession);
    // jwt 认证解析补充
    app.use(expressJWT({ secret: secretKey }).unless({ path: unless }));

    logger(`跨域请求已开启`);
    // 路由处理
    const iMw = new InitMiddleware(app);
    // 路由初始化
    iMw.routerInit().then((_app) => _app.use(errMiddleware))
  }

  /**
   * 路由初始化
   * @returns 
   */
  routerInit() {
    // this.app.use("/api", router);
    this.app.use("/api", YRouter)
    logger(`挂载路由：/api`)
    return Promise.resolve(this.app);
  }

  joinDataChunk() {
    // this.app.use((req, res, next) => {
    //   // 对客户端大数据量导致的切片数据进行合并
    //   let str = "";
    //   req.on('data', (chunk) => {
    //     str += chunk
    //   } );
    //   req.on('end', () => {
    //     // 把拼接的数据解析为对象格式
    //     const body = qs.parse(str);
    //     console.log(body, str);
    //     next();
    //   }); 
    // })
  }

  static setJSONP(req, res) {
    const funcName = req.query.callback || "a";
    const data = { name: "cs", age: 20 };
    const srciptStr = `${funcName}(${JSON.stringify(data)})`;
    res.send(srciptStr);
  }
}

module.exports = InitMiddleware;